package com.twb.core.util;

import java.io.UnsupportedEncodingException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;

/**
 * @ClassName StringUtil
 * @Description String工具类
 * 
 * @author DHL
 * @date 2014-1-2 上午10:57:10
 */
public class StringUtil {

	/**
	 * 判断传入的字符串是否为Null或者为空字符串
	 *
	 * @param str
	 * @return
	 */
	public static boolean isNullOrWhiteSpace(String str) {
		boolean bl = false;
		if (str == null || "".equals(str)) {
			bl = true;
		}
		return bl;
	}

	/**
	 * 格式化字符串
	 * 
	 * 例：formateString("xxx{0}bbb",1) = xxx1bbb
	 * 
	 * @param str
	 * @param params
	 * @return
	 */
	public static String formateString(String str, String... params) {
		for (int i = 0; i < params.length; i++) {
			str = str.replace("{" + i + "}", params[i] == null ? "" : params[i]);
		}
		return str;
	}

	/**
	 * 格式化字符串
	 * 
	 * 例： Map<String, String> map = new HashMap<String, String>(); map.put("name",
	 * "张三"); formateStringByMap("xxx{name}bbb", map) = xxx张三bbb
	 * 
	 * @param str
	 * @param params
	 * @return
	 */
	public static String formateStringByMap(String str, Map<String, String> params) {
		if (str != null && !"".equals(str) && params != null && params.size() > 0) {
			for (String key : params.keySet()) {
				str = str.replace("{" + key + "}", params.get(key));
			}
		} else {
			return null;
		}
		return str;
	}

	/**
	 * @Title getBracketStrs
	 * @Class StringUtil.java
	 * @Description 用正则获取字符串第一个括号内的内容
	 * 
	 * @param str
	 * @return
	 * 
	 * @author DSY
	 * @date 2014年8月22日 上午11:50:30
	 */
	public static String getBracketStrs(String str) {
		String regStr = "(?<=\\()[^\\)]+";
		Pattern pat = Pattern.compile(regStr);
		Matcher matcher = pat.matcher(str);
		if (matcher.find()) {
			return matcher.group();
		}
		return "";
	}

	/**
	 * 判断字符串是否为数字
	 */
	public static boolean isNumeric(String str) {
		return NumberUtils.isDigits(str);
	}

	/**
	 * @Title removeInternalBlank
	 * @Class StringUtil.java
	 * @Description 去除字符串内部空格
	 * 
	 * @param s
	 * @return
	 * 
	 * @author DHL
	 * @date 2014年9月23日 上午8:49:56
	 */
	public static String removeInternalBlank(String s) {

		if (StringUtils.isBlank(s)) {
			return s;
		}

		Pattern p = Pattern.compile("\\s*|\t|\r|\n");
		Matcher m = p.matcher(s);
		char str[] = s.toCharArray();
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < str.length; i++) {
			if (str[i] == ' ') {
				sb.append(' ');
			} else {
				break;
			}
		}
		String after = m.replaceAll("");
		return sb.toString() + after;
	}

	/**
	 * @Title firstLetterToLower
	 * @Class StringUtil.java
	 * @Description 首字母小写
	 * 
	 * @param str
	 * @return
	 * 
	 * @author DHL
	 * @date 2015年12月25日 下午12:10:52
	 */
	public static String firstLetterToLower(String str) {
		return str.substring(0, 1).toLowerCase() + str.substring(1);
	}

	/**
	 * @Title firstLetterToUpper
	 * @Class StringUtil.java
	 * @Description 首字母大写
	 * 
	 * @param str
	 * @return
	 * 
	 * @author DHL
	 * @date 2015年12月25日 下午12:11:33
	 */
	public static String firstLetterToUpper(String str) {
		return str.substring(0, 1).toUpperCase() + str.substring(1);
	}

	/**
	 * @Title addPoint
	 * @Class StringUtil.java
	 * @Description 是否加 "."
	 * 
	 * @param str
	 * @param addStr
	 * @return
	 * 
	 * @author DHL
	 * @date 2015年12月25日 下午12:44:51
	 */
	public static String addPoint(String str, String addStr) {
		String result = str;
		if (str.endsWith(".")) {
			result += addStr;
		} else {
			result += "." + addStr;
		}
		return result;
	}

	/**
	 * @Title convertPoint
	 * @Class StringUtil.java
	 * @Description 把字符串中的带.与"转成/
	 * 
	 * @param orgStr
	 * @return
	 * 
	 * @author DHL
	 * @date 2015年12月25日 下午12:47:57
	 */
	public static String convertPoint(String orgStr) {
		return orgStr.replace(".", "/").replace(";", "/");
	}

	/**
	 * @Title convertUnderLine
	 * @Class StringUtil.java
	 * @Description 下划线转驼峰
	 * 
	 * @param orgStr
	 * @return
	 * 
	 * @author DHL
	 * @date 2016年4月1日 上午9:52:06
	 */
	public static String convertCamel(String orgStr) {
		String[] split = orgStr.split("_");
		orgStr = "";
		for (int i = 0; i < split.length; i++) {
			if (i == 0) {
				orgStr += firstLetterToLower(split[i]);
			} else {
				orgStr += firstLetterToUpper(split[i]);
			}
		}
		return orgStr;
	}

	/**
	 * @Title convertUnderLine
	 * @Description 驼峰转下划线
	 * @param str
	 * @return
	 * @author DSY
	 * @date 2018年11月9日 下午3:33:04
	 */
	public static String convertUnderLine(String str) {
		Pattern pattern = Pattern.compile("[A-Z]");
		Matcher matcher = pattern.matcher(str);
		StringBuffer sb = new StringBuffer(str);
		if (matcher.find()) {
			sb = new StringBuffer();
			// 将当前匹配子串替换为指定字符串，并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个StringBuffer对象里。
			// 正则之前的字符和被替换的字符
			matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
			// 把之后的也添加到StringBuffer对象里
			matcher.appendTail(sb);
		} else {
			return sb.toString();
		}
		return convertUnderLine(sb.toString());
	}

	/**
	 * @Title convertQuot
	 * @Class StringUtil.java
	 * @Description 把字符串中的带‘与"转成\'与\"
	 * 
	 * @param orgStr
	 * @return
	 * 
	 * @author DHL
	 * @date 2016年4月1日 上午9:54:06
	 */
	public static String convertQuot(String orgStr) {
		return orgStr.replace("'", "\\'").replace("\"", "\\\"");
	}

	/**
	 * @Title htmlEntityToString
	 * @Class StringUtil.java
	 * @Description HTML实体编码转成普通的编码
	 * 
	 * @param dataStr
	 * @return
	 * 
	 * @author DHL
	 * @date 2014-3-12 下午9:11:48
	 */
	public static String htmlEntityToString(final String dataStr) {
		int start = 0;
		int end = 0;
		final StringBuffer buffer = new StringBuffer();
		while (start > -1) {
			int system = 10;// 进制
			if (start == 0) {
				int t = dataStr.indexOf("&#");
				if (start != t)
					start = t;
			}
			end = dataStr.indexOf(";", start + 2);
			String charStr = "";
			if (end != -1) {
				charStr = dataStr.substring(start + 2, end);
				// 判断进制
				char s = charStr.charAt(0);
				if (s == 'x' || s == 'X') {
					system = 16;
					charStr = charStr.substring(1);
				}
			}
			// 转换
			try {
				char letter = (char) Integer.parseInt(charStr, system);
				buffer.append(new Character(letter).toString());
			} catch (NumberFormatException e) {
				e.printStackTrace();
			}
			// 处理当前unicode字符到下一个unicode字符之间的非unicode字符
			start = dataStr.indexOf("&#", end);
			if (start - end > 1) {
				buffer.append(dataStr.substring(end + 1, start));
			}
			// 处理最后面的非unicode字符
			if (start == -1) {
				int length = dataStr.length();
				if (end + 1 != length) {
					buffer.append(dataStr.substring(end + 1, length));
				}
			}
		}
		return buffer.toString();
	}

	/**
	 * @Title stringToHtmlEntity
	 * @Class StringUtil.java
	 * @Description 把String转成html实体字符
	 * 
	 * @param str
	 * @return
	 * 
	 * @author DHL
	 * @date 2014-3-12 下午9:12:07
	 */
	public static String stringToHtmlEntity(String str) {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < str.length(); i++) {
			char c = str.charAt(i);
			switch (c) {
			case 0x0A:
				sb.append(c);
				break;
			case '<':
				sb.append("&lt;");
				break;
			case '>':
				sb.append("&gt;");
				break;
			case '&':
				sb.append("&amp;");
				break;
			case '\'':
				sb.append("&apos;");
				break;
			case '"':
				sb.append("&quot;");
				break;
			default:
				if ((c < ' ') || (c > 0x7E)) {
					sb.append("&#x");
					sb.append(Integer.toString(c, 16));
					sb.append(';');
				} else {
					sb.append(c);
				}
			}
		}
		return sb.toString();
	}

	/**
	 * @Title stringToUnicode
	 * @Class StringUtil.java
	 * @Description String转unicode
	 * 
	 * @param s
	 * @return
	 * 
	 * @author DHL
	 * @date 2014-3-12 下午9:12:24
	 */
	public static String stringToUnicode(String s) {
		String unicode = "";
		char[] charAry = new char[s.length()];
		for (int i = 0; i < charAry.length; i++) {
			charAry[i] = (char) s.charAt(i);
			unicode += "\\u" + Integer.toString(charAry[i], 16);
		}
		return unicode;
	}

	/**
	 * @Title unicodeToString
	 * @Class StringUtil.java
	 * @Description unicode转String
	 * 
	 * @param unicodeStr
	 * @return
	 * 
	 * @author DHL
	 * @date 2014-3-12 下午9:12:45
	 */
	public static String unicodeToString(String unicodeStr) {
		StringBuffer sb = new StringBuffer();
		String str[] = unicodeStr.toUpperCase().split("\\\\U");
		for (int i = 0; i < str.length; i++) {
			if (str[i].equals(""))
				continue;
			char c = (char) Integer.parseInt(str[i].trim(), 16);
			sb.append(c);
		}
		return sb.toString();
	}

	/**
	 * @Title html2Text
	 * @Class StringUtil.java
	 * @Description html转文本
	 * 
	 * @param inputString
	 * @return
	 * 
	 * @author DHL
	 * @date 2014-3-12 下午9:13:01
	 */
	public static String html2Text(String inputString) {
		String htmlStr = inputString; // 含html标签的字符串
		String textStr = "";
		java.util.regex.Pattern p_script;
		java.util.regex.Matcher m_script;
		java.util.regex.Pattern p_style;
		java.util.regex.Matcher m_style;
		java.util.regex.Pattern p_html;
		java.util.regex.Matcher m_html;
		try {
			String regEx_script = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>"; // 定义script的正则表达式{或<script>]*?>[\s\S]*?<\/script>
			// }
			String regEx_style = "<[\\s]*?style[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?style[\\s]*?>"; // 定义style的正则表达式{或<style>]*?>[\s\S]*?<\/style>
			// }
			String regEx_html = "<[^>]+>"; // 定义HTML标签的正则表达式
			p_script = java.util.regex.Pattern.compile(regEx_script, java.util.regex.Pattern.CASE_INSENSITIVE);
			m_script = p_script.matcher(htmlStr);
			htmlStr = m_script.replaceAll(""); // 过滤script标签
			p_style = java.util.regex.Pattern.compile(regEx_style, java.util.regex.Pattern.CASE_INSENSITIVE);
			m_style = p_style.matcher(htmlStr);
			htmlStr = m_style.replaceAll(""); // 过滤style标签
			p_html = java.util.regex.Pattern.compile(regEx_html, java.util.regex.Pattern.CASE_INSENSITIVE);
			m_html = p_html.matcher(htmlStr);
			htmlStr = m_html.replaceAll(""); // 过滤html标签
			textStr = htmlStr;
		} catch (Exception e) {
			System.err.println("Html2Text: " + e.getMessage());
		}
		return textStr;// 返回文本字符串
	}

	/**
	 * @Title escape
	 * @Class StringUtil.java
	 * @Description escape编码
	 * 
	 * @param src
	 * @return
	 * 
	 * @author DHL
	 * @date 2014-3-12 下午9:13:17
	 */
	public static String escape(String src) {
		int i;
		char j;
		StringBuffer tmp = new StringBuffer();
		tmp.ensureCapacity(src.length() * 6);
		for (i = 0; i < src.length(); i++) {
			j = src.charAt(i);
			if (Character.isDigit(j) || Character.isLowerCase(j) || Character.isUpperCase(j))
				tmp.append(j);
			else if (j < 256) {
				tmp.append("%");
				if (j < 16)
					tmp.append("0");
				tmp.append(Integer.toString(j, 16));
			} else {
				tmp.append("%u");
				tmp.append(Integer.toString(j, 16));
			}
		}
		return tmp.toString();
	}

	/**
	 * @Title unescape
	 * @Class StringUtil.java
	 * @Description unescape解码
	 * 
	 * @param src
	 * @return
	 * 
	 * @author DHL
	 * @date 2016年4月1日 上午9:59:07
	 */
	public static String unescape(String src) {
		StringBuffer tmp = new StringBuffer();
		tmp.ensureCapacity(src.length());
		int lastPos = 0, pos = 0;
		char ch;
		while (lastPos < src.length()) {
			pos = src.indexOf("%", lastPos);
			if (pos == lastPos) {
				if (src.charAt(pos + 1) == 'u') {
					ch = (char) Integer.parseInt(src.substring(pos + 2, pos + 6), 16);
					tmp.append(ch);
					lastPos = pos + 6;
				} else {
					ch = (char) Integer.parseInt(src.substring(pos + 1, pos + 3), 16);
					tmp.append(ch);
					lastPos = pos + 3;
				}
			} else {
				if (pos == -1) {
					tmp.append(src.substring(lastPos));
					lastPos = src.length();
				} else {
					tmp.append(src.substring(lastPos, pos));
					lastPos = pos;
				}
			}
		}
		return tmp.toString();
	}

	public static String decodeStr(String encodeparam) {
		try {
			if (encodeparam == null || "".equalsIgnoreCase(encodeparam)) {
				return null;
			}
			return java.net.URLDecoder.decode(encodeparam, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * @Title formatDou2Str
	 * @Class StringUtil.java
	 * @Description Double转String
	 * 
	 * @param d
	 * @return
	 * 
	 * @author DHL
	 * @date 2014-3-12 下午9:13:44
	 */
	public static String formatDou2Str(Double d) {
		if (d == null)
			return "0";
		DecimalFormat df = new DecimalFormat("#.0");
		return df.format(d);
	}

	/**
	 * @Title replaceSlash
	 * @Class StringUtil.java
	 * @Description 替换斜杠
	 * 
	 * @param str
	 * @return
	 * 
	 * @author DHL
	 * @date 2014-3-12 下午9:14:49
	 */
	public static String replaceSlash(String str) {
		String result = str.replaceAll("//", ".");
		result = result.replaceAll("/", ".");
		result = result.replaceAll("\\\\", ".");
		return result;
	}

	/**
	 * 
	 * @Title mapSSToMapSO
	 * @Class StringUtil.java
	 * @Package com.dths.web.servlet.utils
	 * @Description 把<String,String> AND <String,String[]> 转换为 <String,Object> 类型
	 * @param paramMapSS
	 * @return Map<String,Object>
	 * @author mengxin
	 * @date 2014-8-26 下午5:20:24
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public static Map<String, Object> mapSSToMapSO(Map paramMapSS) {
		Map<String, Object> returnMap = new HashMap<String, Object>();
		if (paramMapSS != null) {
			Set<Entry<String, Object>> entrySet = paramMapSS.entrySet();
			for (Entry<String, Object> entry : entrySet) {
				if (entry.getValue() instanceof String[]) {
					String[] value = (String[]) entry.getValue();
					returnMap.put(entry.getKey(), value[0]);
				} else if (entry.getValue() instanceof String) {
					String value = (String) entry.getValue();
					returnMap.put(entry.getKey(), value);
				}
			}
		}
		return returnMap;
	}

	/**
	 * 通过正则表达式获取内容
	 * 
	 * @param regex 正则表达式
	 * @param from  原字符串
	 * @return
	 */
	public static String[] regex(String regex, String from) {
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(from);
		List<String> results = new ArrayList<String>();
		while (matcher.find()) {
			for (int i = 0; i < matcher.groupCount(); i++) {
				results.add(matcher.group(i + 1));
			}
		}
		return results.toArray(new String[] {});
	}

	/**
	 * uuid 转换成guid
	 * 
	 * @param uuid
	 * @return
	 */
	public static String uuidToguid(String uuid) {
		String guid = uuid.replace("-", "");
		StringBuffer sb = new StringBuffer(36);
		sb.append(guid.substring(0, 8));
		sb.append("-");
		sb.append(guid.substring(8, 12));
		sb.append("-");
		sb.append(guid.substring(12, 16));
		sb.append("-");
		sb.append(guid.substring(16, 20));
		sb.append("-");
		sb.append(guid.substring(20));
		return sb.toString();
	}

	/**
	 * 判断字符串是否为空
	 */
	public static boolean isEmpty(String str) {
		if (str != null) {
			str = str.trim();
		}
		return StringUtils.isEmpty(str);
	}

	/**
	 * 判断字符串是否非空
	 */
	public static boolean isNotEmpty(String str) {
		return !isEmpty(str);
	}

	/**
	 * @Title getRandomCode
	 * @Description 获取随机数
	 * @param length 随机数长度
	 * @return
	 * @author DSY
	 * @date 2018年11月29日 下午5:42:59
	 */
	public static String getRandomCode(int length) {
		String sources = "0123456789"; // 加上一些字母，就可以生成pc站的验证码了
		Random rand = new Random();
		StringBuffer flag = new StringBuffer();
		for (int j = 0; j < length; j++) {
			flag.append(sources.charAt(rand.nextInt(9)) + "");
		}
		return flag.toString();
	}

	/**
	 * @Title getElExpStr
	 * @Description 获取el表达式的内容，即匹配${}的内容
	 * @param str
	 * @return
	 * @author DSY
	 * @date 2019年1月30日 上午10:44:42
	 */
	public static String getElExpStr(String str) {
		String result = "";
		Matcher mat = Pattern.compile("(?<=\\$\\{)(\\S+)(?=\\})").matcher(str);
		while (mat.find()) {
			result = mat.group();
			break;
		}
		return result;
	}

	/**
	 * @Title convertToLike
	 * @Description 拼接SQL like
	 * @param obj
	 * @return
	 * @author DHL
	 * @date 2021年3月25日 下午3:26:06
	 */
	public static String convertToLike(String obj) {
		return "%" + obj + "%";
	}

	/**
	 * @Title StringFilter
	 * @Description 过滤掉特殊字符
	 * @param str
	 * @return
	 * @throws PatternSyntaxException
	 * @AuthorOriginally DSY
	 * @date 2022年8月25日 下午1:34:59
	 */
	public static String StringFilter(String str) throws PatternSyntaxException {
		// 清除掉所有特殊字符
		String regEx = "[`~!#$%^&*+=|{}':;',\\[\\].<>/?~#%&*——+|{}]";
		Pattern p = Pattern.compile(regEx);
		Matcher m = p.matcher(str);
		return m.replaceAll("").trim();
	}

	public static void main(String[] args) {
		System.out.println(getElExpStr("${flag==1}"));
	}
}
